package com.campus.help.service;

import java.util.List;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.campus.help.entity.Labor;
import com.campus.help.entity.LaborApplication;
import com.campus.help.vo.LaborVO;

/**
 * 劳务服务接口
 *
 * @author campus-help
 * @since 2025-09-18
 */
public interface LaborService {

    /**
     * 分页查询劳务列表
     *
     * @param page     页码
     * @param size     每页大小
     * @param keyword  搜索关键词
     * @param location 地点筛选
     * @param workType 工作类型筛选
     * @param urgent   是否紧急
     * @param date     日期筛选（格式：yyyy-MM-dd）
     * @return 劳务列表
     */
    Page<Labor> getLaborList(int page, int size, String keyword, String location, String workType, Boolean urgent, String date);

    /**
     * 分页查询劳务列表（包含类型信息）
     *
     * @param page     页码
     * @param size     每页大小
     * @param keyword  搜索关键词
     * @param typeId   劳务类型ID筛选
     * @param location 地点筛选
     * @param workType 工作类型筛选
     * @param urgent   是否紧急
     * @param date     日期筛选（格式：yyyy-MM-dd）
     * @param schoolId 学校ID（用于数据隔离）
     * @return 劳务列表（包含类型信息）
     */
    Page<LaborVO> getLaborListWithType(int page, int size, String keyword, Long typeId, String location, String workType, Boolean urgent, String date, Long schoolId);

    /**
     * 根据ID获取劳务详情
     *
     * @param id 劳务ID
     * @return 劳务详情
     */
    Labor getLaborDetail(Long id);

    /**
     * 获取劳务详情（包含发布者信息）
     *
     * @param id 劳务ID
     * @return 劳务详情VO
     */
    com.campus.help.vo.LaborDetailVO getLaborDetailWithPublisher(Long id);

    /**
     * 发布劳务
     *
     * @param labor       劳务信息
     * @param publisherId 发布者ID
     * @param schoolId    学校ID
     * @return 发布的劳务信息
     */
    Labor publishLabor(Labor labor, Long publisherId, Long schoolId);

    /**
     * 更新劳务信息
     *
     * @param labor       劳务信息
     * @param publisherId 发布者ID
     * @return 更新后的劳务信息
     */
    Labor updateLabor(Labor labor, Long publisherId);

    /**
     * 关闭劳务
     *
     * @param id          劳务ID
     * @param publisherId 发布者ID
     * @return 是否成功
     */
    boolean closeLabor(Long id, Long publisherId);

    /**
     * 申请劳务
     *
     * @param laborId         劳务ID
     * @param applicantId     申请者ID
     * @param applicationNote 申请说明
     * @return 申请记录
     */
    LaborApplication applyLabor(Long laborId, Long applicantId, String applicationNote);

    /**
     * 获取劳务申请列表
     *
     * @param laborId     劳务ID
     * @param publisherId 发布者ID
     * @return 申请列表
     */
    List<com.campus.help.vo.LaborApplicationVO> getLaborApplications(Long laborId, Long publisherId);

    /**
     * 分页获取劳务申请列表
     *
     * @param laborId     劳务ID
     * @param publisherId 发布者ID
     * @param page        页码
     * @param size        每页大小
     * @return 分页申请列表
     */
    Page<com.campus.help.vo.LaborApplicationVO> getLaborApplicationsPage(Long laborId, Long publisherId, int page, int size);

    /**
     * 审核劳务申请
     *
     * @param applicationId 申请ID
     * @param status        审核状态
     * @param reviewNote    审核说明
     * @param publisherId   发布者ID
     * @return 是否成功
     */
    boolean reviewApplication(Long applicationId, String status, String reviewNote, Long publisherId);

    /**
     * 完成劳务
     *
     * @param applicationId 申请ID
     * @param completeNote  完成说明
     * @param userId        用户ID
     * @return 是否成功
     */
    boolean completeLabor(Long applicationId, String completeNote, Long userId);

    /**
     * 获取用户发布的劳务列表
     *
     * @param publisherId 发布者ID
     * @param page        页码
     * @param size        每页大小
     * @return 劳务列表
     */
    Page<Labor> getMyPublishedLabors(Long publisherId, int page, int size);

    /**
     * 根据状态获取用户发布的劳务列表
     *
     * @param publisherId 发布者ID
     * @param status      状态
     * @param page        页码
     * @param size        每页大小
     * @return 劳务列表
     */
    Page<Labor> getMyPublishedLaborsByStatus(Long publisherId, String status, int page, int size);

    /**
     * 获取用户申请的劳务列表
     *
     * @param applicantId 申请者ID
     * @param page        页码
     * @param size        每页大小
     * @return 申请列表
     */
    Page<LaborApplication> getMyLaborApplications(Long applicantId, int page, int size);

    /**
     * 增加浏览次数
     *
     * @param id 劳务ID
     */
    void incrementViewCount(Long id);

    /**
     * 获取热门劳务服务（按浏览次数排序）
     *
     * @param limit 返回数量限制
     * @param schoolId 学校ID（用于数据隔离）
     * @return 热门劳务列表
     */
    List<Labor> getHotLabors(int limit, Long schoolId);

    /**
     * 获取劳务统计信息
     *
     * @return 劳务统计信息
     */
    com.campus.help.dto.LaborStats getLaborStats();
}
